// 引入 store 仓库
import store from '@/store'
// 配置路由的插件
import Vue from 'vue'
import VueRouter from 'vue-router'
// 使用插件
Vue.use(VueRouter)
// 路由配置文件
import routes from './routes'

// 先把VueRouter原型对象的push，先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace

// 重写 push | replace
// resolve   reject      成功与失败的回调
VueRouter.prototype.push = function (location, resolve, reject) {
  //当前函数this：即为VueRouter类的实例
  //相当于push方法里面this，是windows【完犊子了】
  //利用人家push方法实现路由跳转，保证push里面this,应该vueRouter类的实例

  //面试:函数apply与call区别?
  //相同的地方:都可以篡改函数里面this
  //不同的地方:apply传递参数 数组  call传递参数 逗号分割

  if (resolve && reject) {
    //代表真:代表着两个形参接受参数【箭头函数】
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(this, location, () => { }, () => { });
  }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    //代表真:代表着两个形参接受参数【箭头函数】
    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(this, location, () => { }, () => { });
  }
}
// 配置路由
let router = new VueRouter({

  // 配置路由
  routes,

  scrollBehavior() {
    // y:0   值代表滚动条距离顶部的距离  ----路由跳转后
    return { y: 0 }
  }
})

router.beforeEach(async (to, from, next) => {
  // 放行函数
  next()
  // token   用户登录了才有token
  let token = store.state.user.userToken
  // 
  let name = store.state.user.userInfo.name
  // console.log(store.state.user.userToken);
  // 如果用户已经登录
  if (token) {
    // 判断 用户如果想要跳转到登录页面  ---不允许
    if (to.path == '/login') {
      // 将页面 重新导航回首页
      next('/home')
    } else {
      // 登录了，但是去得不是 登录页 /login  
      if (name) {
        next()
      } else {
        // 没有用户信息  派发 acions
        try {
          // 获取用户信息
          await store.dispatch('getUserInfo')
          // 放行
          next()
        } catch (error) {
          // token 时间久了 会失效 获取不到token  重新登录
          await store.dispatch('userLginOut')
          next('/login')

        }
      }
    }
  } else {
    //未登录 ---不能去交易相关 支付相关  不能去个人中心
    // 未登录去上面这些路由  ---- 登录
    let topath = to.path
    // console.log(to);
    if(topath.indexOf('/trade')!= -1 || topath.indexOf('/pay')!= -1 || topath.indexOf('/center')!= -1){
      // 把未登录 的时候想去而没有去成的信息，存储与地址栏中
    next('/login?redirect='+topath)
    }else{
    //  .....去的时候 不是交易相关 支付相关  不能去个人中心
    // 放行
    next()
    }

  }
})

export default router